package com.ffggffgfv.backend.controller;

import com.ffggffgfv.backend.dto.MerchantInfoDTO;
import com.ffggffgfv.backend.dto.MerchantUpdateDTO;
import com.ffggffgfv.backend.dto.PageResult;
import com.ffggffgfv.backend.entity.Merchant;
import com.ffggffgfv.backend.entity.Product;
import com.ffggffgfv.backend.service.MerchantService;
import com.ffggffgfv.backend.util.JWTUtil;
import com.ffggffgfv.backend.util.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * 商家控制器
 */
@RestController
@RequestMapping("/api/merchant")
public class MerchantController {

    @Autowired
    private MerchantService merchantService;

    @Autowired
    private JWTUtil jwtUtil;

    /**
     * 获取当前商家信息
     *
     * @param token JWT令牌
     * @return 商家信息
     */
    @GetMapping("/info")
    public Result getCurrentMerchantInfo(@RequestHeader(value = "Authorization") String token) {
        // 从令牌中提取商家ID
        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7);
            try {
                Long merchantId = jwtUtil.extractUserId(token);
                MerchantInfoDTO merchantInfo = merchantService.getMerchantInfo(merchantId);

                if (merchantInfo == null) {
                    return Result.unauthorized("商家不存在或已被禁用");
                }

                return Result.success(merchantInfo, "获取商家信息成功");

            } catch (Exception e) {
                return Result.unauthorized("无效的认证令牌");
            }
        }
        return Result.unauthorized("未提供认证令牌");
    }

    /**
     * 更新商家信息
     *
     * @param updateDTO 更新信息
     * @param token     JWT令牌
     * @return 更新结果
     */
    @PutMapping("/info")
    public Result updateMerchant(@RequestBody MerchantUpdateDTO updateDTO, @RequestHeader(value = "Authorization") String token) {
        // 从令牌中提取商家ID
        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7);
            try {
                Long merchantId = jwtUtil.extractUserId(token);

                // 更新信息
                Merchant updatedMerchant = merchantService.updateMerchant(merchantId, updateDTO);

                if (updatedMerchant == null) {
                    return Result.validateFailed("更新失败，可能原密码错误或商家不存在");
                }

                return Result.success(updatedMerchant, "信息更新成功");

            } catch (Exception e) {
                return Result.unauthorized("无效的认证令牌");
            }
        }
        return Result.unauthorized("未提供认证令牌");
    }

    /**
     * 获取商家的商品列表
     *
     * @param pageNum  页码
     * @param pageSize 每页数量
     * @param token    JWT令牌
     * @return 商品列表
     */
    @GetMapping("/products")
    public Result getMerchantProducts(
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "10") Integer pageSize,
            @RequestHeader(value = "Authorization") String token) {

        // 从令牌中提取商家ID
        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7);
            try {
                Long merchantId = jwtUtil.extractUserId(token);

                PageResult<Product> pageResult = merchantService.getMerchantProducts(merchantId, pageNum, pageSize);
                return Result.success(pageResult, "获取商品列表成功");

            } catch (Exception e) {
                return Result.unauthorized("无效的认证令牌");
            }
        }
        return Result.unauthorized("未提供认证令牌");
    }

    /**
     * 获取商家统计信息
     *
     * @param token JWT令牌
     * @return 统计信息
     */
    @GetMapping("/statistics")
    public Result getStatistics(@RequestHeader(value = "Authorization") String token) {
        // 从令牌中提取商家ID
        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7);
            try {
                Long merchantId = jwtUtil.extractUserId(token);

                Map<String, Object> statistics = merchantService.getStatistics(merchantId);
                return Result.success(statistics, "获取统计信息成功");

            } catch (Exception e) {
                return Result.unauthorized("无效的认证令牌");
            }
        }
        return Result.unauthorized("未提供认证令牌");
    }

    /**
     * 管理员用：获取所有商家列表（分页）
     *
     * @param name     商家名称（可选）
     * @param status   状态（可选）
     * @param pageNum  页码
     * @param pageSize 每页数量
     * @param token    JWT令牌
     * @return 商家列表
     */
    @GetMapping("/admin/list")
    public Result getAllMerchants(
            @RequestParam(required = false) String name,
            @RequestParam(required = false) Integer status,
            @RequestParam(defaultValue = "1") Integer pageNum,
            @RequestParam(defaultValue = "10") Integer pageSize,
            @RequestHeader(value = "Authorization") String token) {

        // 验证是否有超级管理员权限
        if (!validateAdminPermission(token)) {
            return Result.forbidden("无权访问");
        }

        PageResult<Merchant> pageResult = merchantService.findByPage(name, status, pageNum, pageSize);
        return Result.success(pageResult, "获取商家列表成功");
    }

    /**
     * 管理员用：更新商家状态
     *
     * @param id     商家ID
     * @param status 状态（0-停用 1-启用）
     * @param token  JWT令牌
     * @return 更新结果
     */
    @PutMapping("/admin/{id}/status")
    public Result updateMerchantStatus(
            @PathVariable Long id,
            @RequestParam Integer status,
            @RequestHeader(value = "Authorization") String token) {

        // 验证是否有超级管理员权限
        if (!validateAdminPermission(token)) {
            return Result.forbidden("无权操作");
        }

        // 参数验证
        if (status != 0 && status != 1) {
            return Result.validateFailed("状态值无效");
        }

        // 更新状态
        boolean success = merchantService.updateStatus(id, status);

        if (!success) {
            return Result.validateFailed("商家不存在或状态更新失败");
        }

        String statusText = status == 1 ? "启用" : "停用";
        return Result.success(null, "商家已" + statusText);
    }

    /**
     * 验证是否有管理员权限
     *
     * @param token JWT令牌
     * @return 是否有权限
     */
    private boolean validateAdminPermission(String token) {
        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7);
            try {
                return jwtUtil.hasAdminRole(token);
            } catch (Exception e) {
                return false;
            }
        }
        return false;
    }
}
